//机器人在一个无限大小的 XY 网格平面上行走，从点 (0, 0) 处开始出发，面向北方。该机器人可以接收以下三种类型的命令 commands ： 
//
// 
// -2 ：向左转 90 度 
// -1 ：向右转 90 度 
// 1 <= x <= 9 ：向前移动 x 个单位长度 
// 
//
// 在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点 obstacles[i] = (xi, yi) 。 
//
// 机器人无法走到障碍物上，它将会停留在障碍物的前一个网格方块上，但仍然可以继续尝试进行该路线的其余部分。 
//
// 返回从原点到机器人所有经过的路径点（坐标为整数）的最大欧式距离的平方。（即，如果距离为 5 ，则返回 25 ） 
//
// 
// 
// 
// 
// 
// 
//
// 
// 注意： 
//
// 
// 北表示 +Y 方向。 
// 东表示 +X 方向。 
// 南表示 -Y 方向。 
// 西表示 -X 方向。 
// 
// 
// 
// 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：commands = [4,-1,3], obstacles = []
//输出：25
//解释：
//机器人开始位于 (0, 0)：
//1. 向北移动 4 个单位，到达 (0, 4)
//2. 右转
//3. 向东移动 3 个单位，到达 (3, 4)
//距离原点最远的是 (3, 4) ，距离为 32 + 42 = 25 
//
// 示例 2： 
//
// 
//输入：commands = [4,-1,4,-2,4], obstacles = [[2,4]]
//输出：65
//解释：机器人开始位于 (0, 0)：
//1. 向北移动 4 个单位，到达 (0, 4)
//2. 右转
//3. 向东移动 1 个单位，然后被位于 (2, 4) 的障碍物阻挡，机器人停在 (1, 4)
//4. 左转
//5. 向北走 4 个单位，到达 (1, 8)
//距离原点最远的是 (1, 8) ，距离为 12 + 82 = 65 
//
// 
//
// 提示： 
//
// 
// 1 <= commands.length <= 104 
// commands[i] is one of the values in the list [-2,-1,1,2,3,4,5,6,7,8,9]. 
// 0 <= obstacles.length <= 104 
// -3 * 104 <= xi, yi <= 3 * 104 
// 答案保证小于 231 
// 
// Related Topics 数组 模拟 
// 👍 142 👎 0


package service.week02.leetcode.editor.cn;

import java.util.HashSet;
import java.util.Set;

//Java：模拟行走机器人
public class P874WalkingRobotSimulation {
    public static void main(String[] args) {
        Solution solution = new P874WalkingRobotSimulation().new Solution();
        System.out.println(solution.robotSim(new int[]{4, -1, 4, -2, 4}, new int[][]{{2, 4}}));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int robotSim(int[] commands, int[][] obstacles) {
            //先处理障碍物
            Set<String> obSet = new HashSet<>();
            for (int[] obstacle : obstacles) {
                obSet.add(calcHash(obstacle[0], obstacle[1]));
            }
            //方向数组
            int[] dirx = {0, 1, 0, 1};
            int[] diry = {1, 0, -1, 0};
            //起点
            int x = 0, y = 0;
            int dir = 0;
            int res = 0;
            //遍历指令
            for (int command : commands) {
                if (command > 0) {
                    for (int i = 0; i < command; i++) {
                        int nextx = x + dirx[dir];
                        int nexty = y + diry[dir];
                        System.out.println(nextx+","+nexty);
                        //存在障碍物则退出
                        if (obSet.contains(calcHash(nextx, nexty))) {
                            break;
                        }else {
                            x = nextx;
                            y = nexty;
                            res = Math.max(res, x * x + y * y);
                        }
                    }
                } else if (command == -1) {
                    //右转
                    dir = (dir + 1) % 4;
                } else {
                    //左转
                    dir = (dir - 1 + 4) % 4;
                }
            }
            return res;
        }

        public String calcHash(int x, int y) {
            return String.valueOf(x) + "," + String.valueOf(y);
        }

    }
//leetcode submit region end(Prohibit modification and deletion)
}